global crear_lista_huffman
;void crear_lista_huffman ( unsigend int * tabla_apariciones, nodo_lista_t **l, nodo_arbol_t **indices_nodos_simbolos )

extern malloc
extern calloc
extern lista_insertar_ordenado

%define p_tabla_apar ebp+8
%define pp_nodo_lista ebp+12
%define pp_indices_nodos_simbolos ebp+16

%define offset_simbolo 0
%define offset_apariciones 1
%define offset_valido 5
%define offset_p_padre	9 
%define offset_p_izq	13
%define offset_p_der	17
%define null 0
%define offset_p_arbol 0
%define offset_siguiente 4
%define long_tabla_apariciones 256
%define sizeof_nodo_arbol 21
%define sizeof_ptr_arbol 4
%define sizeof_nodo_lista 8
%define valido 1
	
section .text

crear_lista_huffman:

	;enter 0,0	Comentado para probar con valgrind
	push ebp
	mov ebp,esp
	
	push ebx
	push esi
	push edi

	push dword sizeof_ptr_arbol
	push dword long_tabla_apariciones
	call calloc		; usamos calloc asi lo no usado queda en null
	add esp,8

	mov edi, [pp_indices_nodos_simbolos]
	mov [edi],eax
	mov edi,eax  		; edi lo dejamos apuntando al array
	
	
	mov esi,[p_tabla_apar]	; esi guarda un puntero a la tabla
	xor ebx,ebx		; ebx guarda el indice en la tabla
_ciclo:
	mov eax, [esi+4*ebx]	; eax recupero la cant. aparicion actual
	cmp eax, 0
	jz _incremento_ciclo	; funciona aquí como un continue de c

	push dword sizeof_nodo_arbol
	call malloc
	add esp,4
	
	mov byte[eax+offset_simbolo],bl ; el simbolo coincide con el indice
	
	mov edx, [esi+4*ebx]	; edx recuero la cant. aparicion actual
	mov [eax+offset_apariciones], edx
	mov dword [eax+offset_valido], valido
	mov dword [eax+offset_p_padre], null
	mov dword [eax+offset_p_izq], null
	mov dword [eax+offset_p_der], null

	mov [edi+4*ebx],eax	; guardamos el puntero a la hoja
	
	push eax		; guardamos el puntero al arbol.
	
	push dword sizeof_nodo_lista
	call malloc
	add esp,4
		
	pop edx			; restauramos el puntero del arbol en edx
	; en edx = ptr al arbol, eax = ptr al nodo de lista
	mov [eax+offset_p_arbol], edx
	mov dword [eax+offset_siguiente],null   ; Inicializamos el nodo con el arbol
	
	push eax		; pasamos el nodo con el arbol a insertar
	push dword [pp_nodo_lista] ; pasamos el puntero doble a la lista 		
	call lista_insertar_ordenado
	add esp,8
	
_incremento_ciclo:
	inc ebx
	
	cmp ebx, long_tabla_apariciones
	jne _ciclo
	
fin:
	pop edi
	pop esi
	pop ebx
	leave
	ret
	








